﻿/************************************************************************

   Extended Silverlight Toolkit

   Copyright (C) 2010-2012 Xceed Software Inc.

   This program is provided to you under the terms of the Microsoft Public
   License (Ms-PL) as published at http://extendedsilverlight.codeplex.com/license

   Please purchase a commercial version of this toolkit if you are using
   it in a commercial product. The commercial versions support the project,
   and also include more features for each control, priority support,
   source code, updates, removed watermark, and a proprietary license.

   Visit http://xceed.com and follow @datagrid on Twitter.

  **********************************************************************/

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace Xceed.Silverlight.Data
{

  internal class DependenceInformation<T>
  {
    public DependenceInformation()
    {
      m_dependenceInformation = new List<DependentOperationInfo<T>>();

    }

    public bool IsEmpty
    {
      get
      {
        return ( m_dependenceInformation.Count == 0 );
      }
    }

    public void RemoveDependentOperations( 
      T dummy, DummyDependenceChecker<T> dependenceChecker, 
      IList<DependentOperationInfo<T>> softDependentOperations,
      IList<DependentOperationInfo<T>> hardDependentOperations )
    {
      for( int i = 0; i < m_dependenceInformation.Count; i++ )
      {
        DependentOperationInfo<T> operation = m_dependenceInformation[ i ];
        if( dependenceChecker( operation.ParentItem, dummy ) )
        {
          if( operation.HardDependence && hardDependentOperations != null )
          {
            hardDependentOperations.Add( operation );
          }
          else if( !operation.HardDependence && softDependentOperations != null )
          {
            softDependentOperations.Add( operation );
          }

          m_dependenceInformation.RemoveAt( i );
          i--;
        }
      }
    }

    public bool HaveHardDependenceOn( T dummy, DummyDependenceChecker<T> dependenceChecker )
    {
      bool haveHardDependence = false;

      for( int i = 0; i < m_dependenceInformation.Count; i++ )
      {
        DependentOperationInfo<T> operation = m_dependenceInformation[ i ];
        if( operation.HardDependence && dependenceChecker( operation.ParentItem, dummy ) )
        {
          haveHardDependence = true;
          break;
        }
      }

      return haveHardDependence;
    }

    public void AddDependent(
      T parentDummyItem,
      int dependentOperationIndex,
      long dependenceOffset,
      bool approximateOffset,
      bool hardDependence )
    {
      if( parentDummyItem == null )
        throw new ArgumentNullException( "parentDummyItem" );

      m_dependenceInformation.Add(
          new DependentOperationInfo<T>( parentDummyItem, dependentOperationIndex, dependenceOffset, approximateOffset, hardDependence )
       );
    }

    private List<DependentOperationInfo<T>> m_dependenceInformation;

  }

  internal delegate bool DummyDependenceChecker<T>(T isThisDummy, T dependOnThisOne);
}
